DAXを使った計算


Spread.Viewsでは、Data Analysis Expression(DAX)言語を使用して計算を実行できます。DAXは、カスタム計算を可能にする数式言語であり、Excelの数式にも使用されるさまざまな関数が含まれます。その他、集計の実行用に設計された独自の関数も提供します。

ここでは、以下の計算タイプについて説明します。

  • 計算列
  • 計算フィールド
  • 列アグリゲータ

計算列

Spread.Viewsでは、データビューに計算列を追加できます。計算列には、対応するデータフィールドの値として、式を入力します。式は等号(=)で開始して入力し、計算結果は実行時に評価されます。

計算列の式には、SUMAVERAGECOUNTROWSFILTERなど、さまざまな関数を含めることができます。また、式では、既存のデータ列や他の計算列を参照できます。これには、SUM([ColumnId])のように、列IDを[ ]で囲んで指定します。

計算列を使用するには、次の手順を実行します。

サンプルコード

  1. 列定義の追加時に、計算列の式を指定します。式は、datafieldオプションに追加できます。列値の計算結果の表示書式は、formatオプションに指定します。
    {
        id: 'salesPercentage',
        caption: 'Percentage',
        dataField: '=[sales] / sum([sales])',
        format: '0.0%',
        cssClass: 'align-right',
        allowEditing: false,
        minWidth: 120    
    }, {
        id: 'performance',
        caption: 'Performance',
        dataField: '=if([sales] > 2000, "good", "bad")',
           presenter: '<span style="color: {{? it.performance=="good"}}green{{??}}red{{?}}">{{=it.performance}}</span>',
           width: 120,
           allowEditing: false
     }
     ];
  2. DIVタグのグリッドIDを呼び出し、コードを初期化します。
    var dataView = new GC.Spread.Views.DataView(document.getElementById('grid1'), data, columns, new GC.Spread.Views.Plugins.GridLayout());

    計算フィールド

Spread.Viewsを使用すると、計算フィールドを作成して、メインのデータビューの外部に表示できます。計算フィールドは、事前定義した名前付き数式であり、ページ上のどこにでも表示できます。

注意: 計算フィールドと計算列はいずれも数式に基づき、類似した機能を持ちますが、それぞれの用法が異なります。計算列では、数式の計算結果が単一の列内で処理されますが、計算フィールドで定義した数式は、ページ上のどこでも使用できます。

計算フィールドを実装するには、次の手順を実行します。

サンプルコード

  1. 計算フィールドを表示するためのボックスを配置する、内部のラッパークラスを定義します。
    <div class="wrapper">
            <div id="grid1" class="grid">
            </div>
            <div class="result">
                <div class="inner-wrapper">
                    <h2 id="totalSales"></h2>
                    <h3>Top Three Sale Products:</h3>
                    <ul id="topSales"></ul>
                </div>
            </div>
        </div>
  2. 列定義を追加してから、DIVタグのグリッドIDを呼び出し、コードを初期化します。

         var columns = [{
                id: 'product',
                caption: 'Product',
                dataField: 'Product',
                width: 280,
                allowEditing: false
            }, {
                id: 'price',
                caption: 'Item Price',
                dataField: 'Price',
                dataType: 'number',
                allowEditing: false
            }, {
                id: 'quantity',
                caption: 'Quantity',
                dataField: 'Quantity',
                dataType: 'number',
                width: 60
            }, {
                id: 'sales',
                caption: 'Sales',
                dataField: '=[price]*[quantity]',
                dataType: 'number',
                format: "$#,##0.00",
                width: 180
            }, {
                id: 'salesPercentage',
                caption: 'Percentage',
                dataField: '=[sales] / sum([sales])',
                format: '0.0%',
                cssClass: 'align-right',
                allowEditing: false,
                minWidth: 120
            }];
    
            var dataView = new GC.Spread.Views.DataView(document.getElementById('grid1'), data, columns, new GC.Spread.Views.Plugins.GridLayout({
                allowEditing: true
            }));
    dataView.data.addCalculatedField('totalSales', 'SUM([sales])', true);
    var excelFormatter = new GC.Spread.Views.Plugins.Formatter.ExcelFormatter(currencyFormat);    
    
      refresh();
      dataView.editing.addHandler(function(sender, args) {
                if (args.status == "endEditing") {
                    refresh();
                }
           });
  3. 列値に基づいて計算ボックスの結果を更新する関数を追加します。

    function refresh() {
                var totalSales = dataView.data.getCalculatedFieldValue('totalSales');
                $('#totalSales').prop('innerHTML', 'Total Sales: ' + '<span style="font-weight:bold">' + excelFormatter.format(totalSales) + '</span>');
    
                var top3Items = dataView.data.evaluate('TOPN(3, summarize([product], "salesSubtotal", sum([sales])), [salesSubtotal])');
    
                var ul = document.getElementById('topSales');
                var fragment = '';
                for (var i = 0, len = top3Items.length; i < len; i++) {
                    fragment += '<li style="font-weight:bold">' + top3Items[i]['product'] + ' ' + excelFormatter.format(top3Items[i]['salesSubtotal']) + '</li>';
                }
                $(fragment).appendTo($(ul).empty());
            }

列アグリゲータ

Spread.Viewsでは、グループ化を使用する際、グループヘッダーまたはグループフッター内の列に集計用の数式を設定できます。

集計式を実装する手順は、次のとおりです。

サンプルコード

  1. 列定義を追加してから、集計式を含めるようにgroupHeaderおよびgroupFooterプロパティを指定します。 groupHeader:Country」列と「State」列をグループ化し、groupHeaderプロパティを使用して、それぞれのヘッダーに集計式を含めます。 groupFooter: groupFooterプロパティを使用して、「Item Price」列と「Quantity」列のフッターに集計式を設定します。
     var columns = [{
                id: 'id',
                caption: 'Order Id',
                dataField: 'Transaction_Id',
                dataType: 'number',
                visible: false
            }, {
                id: 'date',
                caption: 'Date',
                dataField: 'Transaction_Date',
                dataType: 'date',
                format: 'mm/dd/yyyy'
            }, {
                id: 'country',
                caption: 'Country',
                dataField: 'Country',
                width: 180,
                groupHeader: 'quantity: {{=it.eval("=sum([quantity])")}}, percent: {{=it.eval("=sum([quantity]*[price]) / sumx(GROUP.PARENT(), [quantity]*[price])", "0.0%")}}'
            }, {
                id: 'state',
                caption: 'State',
                dataField: 'State',
                width: 120,
                groupHeader: 'quantity: {{=it.eval("=sum([quantity])")}}, percent: {{=it.eval("=sum([quantity]*[price]) / sumx(GROUP.PARENT(), [quantity]*[price])", "0.0%")}}',
            }, {
                id: 'city',
                caption: 'City',
                dataField: 'City',
                width: 120
            }, {
                id: 'name',
                caption: 'Name',
                dataField: 'Name',
                width: 120
            }, {
                id: 'product',
                caption: 'Product',
                dataField: 'Product',
                width: 280
            }, {
                id: 'price',
                caption: 'Item Price',
                dataField: 'Price',
                dataType: 'number',
                groupFooter: 'average: {{=it.eval("=average([price])")}}'
            }, {
                id: 'quantity',
                caption: 'Quantity',
                dataField: 'Quantity',
                dataType: 'number'
            }, {
                id: 'paymentType',
                caption: 'Payment',
                dataField: 'Payment_Type'
            }, {
                id: 'detail',
                caption: 'Detail',
                dataField: 'Product_Detail',
                width: '*'
            }];
  2. DIVタグのグリッドIDを呼び出し、コードを初期化します。groupingプロパティを指定して、各フィールドにcollapsedまたはexpandedプロパティを設定します。
     var dataView = new GC.Spread.Views.DataView(document.getElementById('grid1'), data, columns,
                new GC.Spread.Views.Plugins.GridLayout({
                    grouping: [{
                        field: 'country',
                        collapsed: false,
                        footer: {
                            columns: [{
                                id: 'quantity',
                                groupFooter: 'total: {{=it.eval("=sum([quantity])")}}'
                            }]
                        }
                    }, {
                        field: 'state',
                        collapsed: true,
                        footer: {
                            columns: [{
                                id: 'quantity',
                                groupFooter: 'count: {{=it.eval("=count([quantity])")}}'
                            }]
                        }
                    }]
                }));

参照

getCalculatedFieldValue
グループ化